// utils/websocket.js
let socket = null;
let isConnected = false;
let reconnectTimer = null;

/**
 * 初始化 WebSocket 连接（自动携带 token）
 * @param {Function} onMessage - 接收消息的回调函数
 */
export const initWebSocket = (onMessage) => {
    // 1. 从 localStorage 获取 token（登录时已存储）
    const token = localStorage.getItem('token');
    if (!token) {
        console.error('WebSocket 连接失败：未找到 token');
        return;
    }

    // 2. 关闭已有连接（避免重复连接）
    if (socket) {
        socket.close();
    }

    // 3. 建立连接（token 作为查询参数传递）
    // 注意：WebSocket 地址需替换为你的实际地址（如 ws://localhost:8080/ws）
    const wsUrl = `ws://localhost:8080/ws?token=${encodeURIComponent(token)}`;
    socket = new WebSocket(wsUrl);

    // 4. 连接成功
    socket.onopen = () => {
        console.log('WebSocket 连接成功');
        isConnected = true;
        clearTimeout(reconnectTimer); // 清除重连定时器
    };

    // 5. 接收消息（适配后端返回的格式）
    socket.onmessage = (event) => {
        try {
            const message = JSON.parse(event.data);
            // 只处理类型为 "message" 的消息
            if (message.type === 'message') {
                onMessage(message); // 调用外部传入的回调函数
            }
        } catch (error) {
            console.error('WebSocket 消息解析失败：', error);
        }
    };

    // 6. 连接关闭（自动重连）
    socket.onclose = () => {
        console.log('WebSocket 连接关闭，尝试重连...');
        isConnected = false;
        // 5秒后自动重连
        reconnectTimer = setTimeout(() => {
            initWebSocket(onMessage);
        }, 5000);
    };

    // 7. 连接错误
    socket.onerror = (error) => {
        console.error('WebSocket 错误：', error);
    };
};

/**
 * 发送消息（适配后端要求的格式）
 * @param {Object} data - 消息数据
 * @param {number} data.dialogueId - 会话ID
 * @param {string} data.content - 消息内容
 */
export const sendWebSocketMessage = (data) => {
    if (!isConnected || !socket) {
        console.error('WebSocket 未连接，无法发送消息');
        return false;
    }

    // 构造后端要求的消息格式
    const message = {
        type: 'message', // 固定类型
        dialogueId: data.dialogueId,
        content: data.content
    };

    try {
        socket.send(JSON.stringify(message));
        return true;
    } catch (error) {
        console.error('WebSocket 发送消息失败：', error);
        return false;
    }
};

/**
 * 关闭 WebSocket 连接
 */
export const closeWebSocket = () => {
    if (socket) {
        socket.close();
        socket = null;
        isConnected = false;
        clearTimeout(reconnectTimer);
        console.log('WebSocket 已手动关闭');
    }
};